//4位同步计数器设计
// 该模块是一个简单的时序逻辑电路。在每个时钟 (clock) 上升沿触发时，计数器值加 1；若
// reset 信号为高，则在下一个时钟沿将计数器同步清零。这是实现状态更新和 CPU 时钟驱
// 动的基础组件。设计一个含同步清零的 4 位计数器：

module counter4(
    input wire clock,
    input wire reset,
    output reg [3:0] count
);

always@(posedge clock) begin   //posedge表示上升沿 clock表示时钟信号
    if(reset) //如果是高电平
        begin
            count <= 4'b0000;//清零 非阻塞赋值
        end
    else 
        begin
            count <= count + 1;//每个始终上升沿触发时，计数+1
        end
end

endmodule


//测试文件
//testbench of counter4
`timescale 1ns/100ps
module counter4_tb;
    reg clock;
    reg reset;
    wire[3:0] count;

    counter4 counter4(
        .clock(clock),
        .reset(reset),
        .count(count)
    );

    //生成时钟信号
    initial begin
        clock = 0; //初始将时钟信号设置为低电平
        forever begin
            #5 clock = ~clock; //每过5个时间单位 时钟信号取反
        end
    end

    initial begin
        reset = 1; //复位
    #10 reset = 0; //计数
    #50 reset = 1; //复位
    #20 reset = 0; //计数
    #50 $stop;
    end


endmodule